package my.ClientTorrent;

import java.io.IOException;
import java.io.OutputStream;
import java.util.HashMap;
import java.net.Socket;
import java.util.logging.Level;
import java.util.logging.Logger;

public class PeerMessage {
    /**
     * Membuat bitfield dalam bentuk biner dimana 1 mewakili sudah ada dan 0 mewakili belum ada.
     * @param pathFile Lokasi file tempat penyimpanan hasil download.
     * @param pathTorrent Lokasi file tempat penyimpanan hasil file metainfo torrent
     * @return Kumpulan biner dalam format string
     */
    public static byte[] calculateBitfield(String pathFile, String pathTorrent)
    {
        byte[] result = null;

        return result;
    }

    /**
     * Membuat messege untuk handshake
     * File name akan dihash dengan algoritma SHA1 kemudian diberi header dengan format<pstrlen><pstr><reserved><hash>
     * @param filename String nama filename
     * @return String dengan format <pstrlen><pstr><reserved><hash>
     */
    public static byte[] createHandshake(String filename)
    {
        byte[] result = null;
       
        return result;
    }

    /**
     * Membuat message keep alive (len=0000)
     * @return <len 4 bytes>
     */
    public static byte[] createKeepAlive()
    {
        byte[] result = null;

        return result;
    }

    /**
     * Membuat message have  (len=0001, id=4, payload)
     * @param pieceIndeks indeks piece
     * @return <len><id><pieceIndeks (4 bytes)>
     */
    public static byte[] createHave(int pieceIndeks)
    {
        byte[] result = null;

        return result;
    }

    /**
     * membuat message bitfield (len=0001+X, id=5, payload), dengan X adalah panjang dari payload
     * @param bitfield Bitfield
     * @return <len><id><bitfield (X bytes)>
     */
    public static byte[] createBitfield(byte[] bitfield)
    {
        byte[] result = null;

        return result;
    }

    /**
     * membuat message request <len=0013><id=6><index><begin=0000><length>
     * @param pieceIndeks Indeks piece
     * @param pieceLength panjang piecelength
     * @return <len><id><pieceIndeks (4 bytes)><begin (4 bytes)><pieceLength (4 bytes)>
     */
    public static byte[] createRequest(int pieceIndeks, int pieceLength)
    {
        byte[] result = null;

        return result;
    }

    /**
     * membuat message piece <len=0009+X><id=7><index><begin=0000><block>
     * @param pieceIndeks Indeks piece
     * @param block Block data
     * @return <len><id><pieceIndeks (4 bytes)><begin (4 bytes)><pieceLength (X bytes)>
     */
    public static byte[] createPiece(int pieceIndeks, byte[] block)
    {
        byte[] result = null;

        return result;
    }

    /**
     * membuat message cancel <len=0013><id=6><index><begin=0000><length>
     * @param pieceIndeks Indeks piece
     * @param pieceLength panjang piecelength
     * @return <len><id><pieceIndeks (4 bytes)><begin (4 bytes)><pieceLength (4 bytes)>
     */
    public static byte[] createCancel(int pieceIndeks, int pieceLength)
    {
        byte[] result = null;

        return result;
    }


    /**
     * Mengirim message ke ip memlalui port yang ditentukan
     * @param socket tujuan
     * @param message message yang akan dikirim
     */
    public static void sendMessage(Socket socket, byte[] message)
    {
        OutputStream outputStream = null;
        try {
            outputStream = socket.getOutputStream();
            outputStream.write(message);
        } catch (IOException ex) {
            Logger.getLogger(PeerMessage.class.getName()).log(Level.SEVERE, null, ex);
        } finally {
            try {
                outputStream.close();
            } catch (IOException ex) {
                Logger.getLogger(PeerMessage.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
    }

    /**
     * Mengirim bitfield kesemua peers yang terhubung
     * @param listConnected Daftar IP dan port dari peers yang sedang terhubung
     * @param bitfield Bitfield yang akan dikirim
     */
    public static void broadcastBitfield(HashMap<String,Integer> listConnected, byte[] bitfield)
    {
       
    }
}